//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS CodeArtifact service.
///
///  CodeArtifact is a fully managed artifact repository compatible with language-native package managers and build tools such as npm, Apache Maven, pip, and dotnet. You can use CodeArtifact to share packages with development teams and pull packages. Packages can be pulled from both public and CodeArtifact repositories. You can also create an upstream relationship between a CodeArtifact repository and another repository, which effectively merges their contents from the point of view of a package manager client.   CodeArtifact concepts     Repository: A CodeArtifact repository contains a set of package versions, each of which maps to a set of assets, or files. Repositories are polyglot, so a single repository can contain packages of any supported type. Each repository exposes endpoints for fetching and publishing packages using tools such as the  npm CLI or the Maven CLI ( mvn ). For a list of supported package managers, see the  CodeArtifact User Guide.    Domain: Repositories are aggregated into a higher-level entity known as a domain. All package assets and metadata are stored in the domain, but are consumed through repositories. A given package asset, such as a Maven JAR file, is stored once per domain, no matter how many repositories it's present in. All of the assets and metadata in a domain are encrypted with the same customer master key (CMK) stored in Key Management Service (KMS). Each repository is a member of a single domain and can't be moved to a different domain. The domain allows organizational policy to be applied across multiple repositories, such as which accounts can access repositories in the domain, and which public repositories can be used as sources of packages. Although an organization can have multiple domains, we recommend a single production domain that contains all published artifacts so that teams can find and share packages across their organization.    Package: A package is a bundle of software and the metadata required to resolve dependencies and install the software. CodeArtifact supports npm, PyPI, Maven, NuGet, Swift, Ruby, Cargo, and generic package formats.  For more information about the supported package formats and how to use CodeArtifact with them, see the  CodeArtifact User Guide. In CodeArtifact, a package consists of:   A name (for example, webpack is the name of a popular npm package)   An optional namespace (for example, @types in @types/node)   A set of versions (for example, 1.0.0, 1.0.1, 1.0.2, etc.)   Package-level metadata (for example, npm tags)      Package group: A group of packages that match a specified definition. Package  groups can be used to apply configuration to multiple packages that match a defined pattern using  package format, package namespace, and package name. You can use package groups to more conveniently  configure package origin controls for multiple packages. Package origin controls are used to block or allow ingestion or publishing  of new package versions, which protects users from malicious actions known as dependency substitution attacks.    Package version: A version of a package, such as @types/node 12.6.9. The version number format and semantics vary for different package formats. For example, npm package versions must conform to the Semantic Versioning specification. In CodeArtifact, a package version consists of the version identifier, metadata at the package version level, and a set of assets.    Upstream repository: One repository is upstream of another when the package versions in it can be accessed from the repository endpoint of the downstream repository, effectively merging the contents of the two repositories from the point of view of a client. CodeArtifact allows creating an upstream relationship between two repositories.    Asset: An individual file stored in CodeArtifact associated with a package version, such as an npm .tgz file or Maven POM and JAR files.    CodeArtifact supported API operations     AssociateExternalConnection: Adds an existing external  connection to a repository.     CopyPackageVersions: Copies package versions from one  repository to another repository in the same domain.    CreateDomain: Creates a domain.    CreatePackageGroup: Creates a package group.    CreateRepository: Creates a CodeArtifact repository in a domain.     DeleteDomain: Deletes a domain. You cannot delete a domain that contains repositories.     DeleteDomainPermissionsPolicy: Deletes the resource policy that is set on a domain.    DeletePackage: Deletes a package and all associated package versions.    DeletePackageGroup: Deletes a package group. Does not delete packages or package versions that are associated with a package group.    DeletePackageVersions: Deletes versions of a package. After a package has been deleted, it can be republished, but its assets and metadata cannot be restored because they have been permanently removed from storage.    DeleteRepository: Deletes a repository.               DeleteRepositoryPermissionsPolicy: Deletes the resource policy that is set on a repository.    DescribeDomain: Returns a DomainDescription object that contains information about the requested domain.    DescribePackage: Returns a PackageDescription object that contains details about a package.     DescribePackageGroup: Returns a PackageGroup object that contains details about a package group.     DescribePackageVersion: Returns a PackageVersionDescription object that contains details about a package version.     DescribeRepository: Returns a RepositoryDescription object that contains detailed information about the requested repository.     DisposePackageVersions: Disposes versions of a package. A package version with the status Disposed cannot be restored because they have been permanently removed from storage.    DisassociateExternalConnection: Removes an existing external connection from a repository.               GetAssociatedPackageGroup: Returns the most closely associated package group to the specified package.    GetAuthorizationToken: Generates a temporary authorization token for accessing repositories in the domain. The token expires the authorization period has passed.  The default authorization period is 12 hours and can be customized to any length with a maximum of 12 hours.    GetDomainPermissionsPolicy: Returns the policy of a resource that is attached to the specified domain.     GetPackageVersionAsset: Returns the contents of an asset that is in a package version.     GetPackageVersionReadme: Gets the readme file or descriptive text for a package version.    GetRepositoryEndpoint: Returns the endpoint of a repository for a specific package format. A repository has one endpoint for each  package format:     cargo     generic     maven     npm     nuget     pypi     ruby     swift       GetRepositoryPermissionsPolicy: Returns the resource policy that is set on a repository.               ListAllowedRepositoriesForGroup: Lists the allowed repositories for a package group that has origin configuration set to ALLOW_SPECIFIC_REPOSITORIES.    ListAssociatedPackages: Returns a list of packages associated with the requested package group.    ListDomains: Returns a list of DomainSummary objects. Each returned DomainSummary object contains information about a domain.    ListPackages: Lists the packages in a repository.    ListPackageGroups: Returns a list of package groups in the requested domain.    ListPackageVersionAssets: Lists the assets for a given package version.    ListPackageVersionDependencies: Returns a list of the direct dependencies for a package version.     ListPackageVersions: Returns a list of package versions for a specified package in a repository.    ListRepositories: Returns a list of repositories owned by the Amazon Web Services account that called this method.    ListRepositoriesInDomain: Returns a list of the repositories in a domain.    ListSubPackageGroups: Returns a list of direct children of the specified package group.    PublishPackageVersion: Creates a new package version containing one or more assets.    PutDomainPermissionsPolicy: Attaches a resource policy to a domain.    PutPackageOriginConfiguration: Sets the package origin configuration for a package, which determine  how new versions of the package can be added to a specific repository.    PutRepositoryPermissionsPolicy: Sets the resource policy on a repository that specifies permissions to access it.     UpdatePackageGroup: Updates a package group. This API cannot be used to update a package group's origin configuration or pattern.    UpdatePackageGroupOriginConfiguration: Updates the package origin configuration for a package group.    UpdatePackageVersionsStatus: Updates the status of one or more versions of a package.    UpdateRepository: Updates the properties of a repository.
public struct CodeArtifact: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the CodeArtifact client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "CodeArtifact",
            serviceIdentifier: "codeartifact",
            serviceProtocol: .restjson,
            apiVersion: "2018-09-22",
            endpoint: endpoint,
            errorType: CodeArtifactErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Adds an existing external connection to a repository. One external connection is allowed per repository.  A repository can have one or more upstream repositories, or an external connection.
    @Sendable
    @inlinable
    public func associateExternalConnection(_ input: AssociateExternalConnectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateExternalConnectionResult {
        try await self.client.execute(
            operation: "AssociateExternalConnection", 
            path: "/v1/repository/external-connection", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds an existing external connection to a repository. One external connection is allowed per repository.  A repository can have one or more upstream repositories, or an external connection.
    ///
    /// Parameters:
    ///   - domain: The name of the domain that contains the repository.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - externalConnection:  The name of the external connection to add to the repository. The following values are supported:     public:npmjs - for the npm public repository.     public:nuget-org - for the NuGet Gallery.     public:pypi - for the Python Package Index.     public:maven-central - for Maven Central.     public:maven-googleandroid - for the Google Android repository.     public:maven-gradleplugins - for the Gradle plugins repository.     public:maven-commonsware - for the CommonsWare Android repository.     public:maven-clojars - for the Clojars repository.     public:ruby-gems-org - for RubyGems.org.     public:crates-io - for Crates.io.
    ///   - repository:  The name of the repository to which the external connection is added.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateExternalConnection(
        domain: String,
        domainOwner: String? = nil,
        externalConnection: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateExternalConnectionResult {
        let input = AssociateExternalConnectionRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            externalConnection: externalConnection, 
            repository: repository
        )
        return try await self.associateExternalConnection(input, logger: logger)
    }

    ///  Copies package versions from one repository to another repository in the same domain.    You must specify versions or versionRevisions. You cannot specify both.
    @Sendable
    @inlinable
    public func copyPackageVersions(_ input: CopyPackageVersionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CopyPackageVersionsResult {
        try await self.client.execute(
            operation: "CopyPackageVersions", 
            path: "/v1/package/versions/copy", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Copies package versions from one repository to another repository in the same domain.    You must specify versions or versionRevisions. You cannot specify both.
    ///
    /// Parameters:
    ///   - allowOverwrite:  Set to true to overwrite a package version that already exists in the destination repository. If set to false and the package version already exists in the destination repository, the package version is returned in the failedVersions field of the response with  an ALREADY_EXISTS error code.
    ///   - destinationRepository:  The name of the repository into which package versions are copied.
    ///   - domain:  The name of the domain that contains the source and destination repositories.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  The format of the package versions to be copied.
    ///   - includeFromUpstream:  Set to true to copy packages from repositories that are upstream from the source repository to the destination repository. The default setting is false. For more information, see Working with upstream repositories.
    ///   - namespace: The namespace of the package versions to be copied. The package component that specifies its namespace depends on its type. For example:  The namespace is required when copying package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the package that contains the versions to be copied.
    ///   - sourceRepository:  The name of the repository that contains the package versions to be copied.
    ///   - versionRevisions:  A list of key-value pairs. The keys are package versions and the values are package version revisions. A CopyPackageVersion operation succeeds if the specified versions in the source repository match the specified package version revision.    You must specify versions or versionRevisions. You cannot specify both.
    ///   - versions:  The versions of the package to be copied.    You must specify versions or versionRevisions. You cannot specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func copyPackageVersions(
        allowOverwrite: Bool? = nil,
        destinationRepository: String,
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        includeFromUpstream: Bool? = nil,
        namespace: String? = nil,
        package: String,
        sourceRepository: String,
        versionRevisions: [String: String]? = nil,
        versions: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CopyPackageVersionsResult {
        let input = CopyPackageVersionsRequest(
            allowOverwrite: allowOverwrite, 
            destinationRepository: destinationRepository, 
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            includeFromUpstream: includeFromUpstream, 
            namespace: namespace, 
            package: package, 
            sourceRepository: sourceRepository, 
            versionRevisions: versionRevisions, 
            versions: versions
        )
        return try await self.copyPackageVersions(input, logger: logger)
    }

    ///  Creates a domain. CodeArtifact domains make it easier to manage multiple repositories across an organization. You can use a domain to apply permissions across many repositories owned by different Amazon Web Services accounts. An asset is stored only once in a domain, even if it's in multiple repositories.   Although you can have multiple domains, we recommend a single production domain that contains all published artifacts so that your development teams can find and share packages. You can use a second pre-production domain to test changes to the production domain configuration.
    @Sendable
    @inlinable
    public func createDomain(_ input: CreateDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateDomainResult {
        try await self.client.execute(
            operation: "CreateDomain", 
            path: "/v1/domain", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Creates a domain. CodeArtifact domains make it easier to manage multiple repositories across an organization. You can use a domain to apply permissions across many repositories owned by different Amazon Web Services accounts. An asset is stored only once in a domain, even if it's in multiple repositories.   Although you can have multiple domains, we recommend a single production domain that contains all published artifacts so that your development teams can find and share packages. You can use a second pre-production domain to test changes to the production domain configuration.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain to create. All domain names in an Amazon Web Services Region that are in the same Amazon Web Services account must be unique. The domain name is used as the prefix in DNS hostnames. Do not use sensitive information in a domain name because it is publicly discoverable.
    ///   - encryptionKey:  The encryption key for the domain. This is used to encrypt content stored in a domain. An encryption key can be a key ID, a key Amazon Resource Name (ARN), a key alias, or a key alias ARN. To specify an encryptionKey, your IAM role must have kms:DescribeKey and kms:CreateGrant permissions on the encryption key that is used. For more information, see DescribeKey in the Key Management Service API Reference and Key Management Service API Permissions Reference in the Key Management Service Developer Guide.   CodeArtifact supports only symmetric CMKs. Do not associate an asymmetric CMK with your domain. For more information, see Using symmetric and asymmetric keys in the Key Management Service Developer Guide.
    ///   - tags: One or more tag key-value pairs for the domain.
    ///   - logger: Logger use during operation
    @inlinable
    public func createDomain(
        domain: String,
        encryptionKey: String? = nil,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateDomainResult {
        let input = CreateDomainRequest(
            domain: domain, 
            encryptionKey: encryptionKey, 
            tags: tags
        )
        return try await self.createDomain(input, logger: logger)
    }

    ///  Creates a package group. For more information about creating package groups, including example CLI commands, see Create a package group in the CodeArtifact User Guide.
    @Sendable
    @inlinable
    public func createPackageGroup(_ input: CreatePackageGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreatePackageGroupResult {
        try await self.client.execute(
            operation: "CreatePackageGroup", 
            path: "/v1/package-group", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Creates a package group. For more information about creating package groups, including example CLI commands, see Create a package group in the CodeArtifact User Guide.
    ///
    /// Parameters:
    ///   - contactInfo:  The contact information for the created package group.
    ///   - description:  A description of the package group.
    ///   - domain:  The name of the domain in which you want to create a package group.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - packageGroup: The pattern of the package group to create. The pattern is also the identifier of the package group.
    ///   - tags: One or more tag key-value pairs for the package group.
    ///   - logger: Logger use during operation
    @inlinable
    public func createPackageGroup(
        contactInfo: String? = nil,
        description: String? = nil,
        domain: String,
        domainOwner: String? = nil,
        packageGroup: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreatePackageGroupResult {
        let input = CreatePackageGroupRequest(
            contactInfo: contactInfo, 
            description: description, 
            domain: domain, 
            domainOwner: domainOwner, 
            packageGroup: packageGroup, 
            tags: tags
        )
        return try await self.createPackageGroup(input, logger: logger)
    }

    ///  Creates a repository.
    @Sendable
    @inlinable
    public func createRepository(_ input: CreateRepositoryRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateRepositoryResult {
        try await self.client.execute(
            operation: "CreateRepository", 
            path: "/v1/repository", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Creates a repository.
    ///
    /// Parameters:
    ///   - description:  A description of the created repository.
    ///   - domain:  The name of the domain that contains the created repository.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - repository: The name of the repository to create.
    ///   - tags: One or more tag key-value pairs for the repository.
    ///   - upstreams:  A list of upstream repositories to associate with the repository. The order of the upstream repositories  in the list determines their priority order when CodeArtifact looks for a requested package version. For more  information, see Working with upstream repositories.
    ///   - logger: Logger use during operation
    @inlinable
    public func createRepository(
        description: String? = nil,
        domain: String,
        domainOwner: String? = nil,
        repository: String,
        tags: [Tag]? = nil,
        upstreams: [UpstreamRepository]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateRepositoryResult {
        let input = CreateRepositoryRequest(
            description: description, 
            domain: domain, 
            domainOwner: domainOwner, 
            repository: repository, 
            tags: tags, 
            upstreams: upstreams
        )
        return try await self.createRepository(input, logger: logger)
    }

    ///  Deletes a domain. You cannot delete a domain that contains repositories. If you want to delete a domain with repositories, first delete its repositories.
    @Sendable
    @inlinable
    public func deleteDomain(_ input: DeleteDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteDomainResult {
        try await self.client.execute(
            operation: "DeleteDomain", 
            path: "/v1/domain", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes a domain. You cannot delete a domain that contains repositories. If you want to delete a domain with repositories, first delete its repositories.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain to delete.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDomain(
        domain: String,
        domainOwner: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteDomainResult {
        let input = DeleteDomainRequest(
            domain: domain, 
            domainOwner: domainOwner
        )
        return try await self.deleteDomain(input, logger: logger)
    }

    ///  Deletes the resource policy set on a domain.
    @Sendable
    @inlinable
    public func deleteDomainPermissionsPolicy(_ input: DeleteDomainPermissionsPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteDomainPermissionsPolicyResult {
        try await self.client.execute(
            operation: "DeleteDomainPermissionsPolicy", 
            path: "/v1/domain/permissions/policy", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes the resource policy set on a domain.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain associated with the resource policy to be deleted.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - policyRevision:  The current revision of the resource policy to be deleted. This revision is used for optimistic locking, which prevents others from overwriting your changes to the domain's resource policy.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDomainPermissionsPolicy(
        domain: String,
        domainOwner: String? = nil,
        policyRevision: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteDomainPermissionsPolicyResult {
        let input = DeleteDomainPermissionsPolicyRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            policyRevision: policyRevision
        )
        return try await self.deleteDomainPermissionsPolicy(input, logger: logger)
    }

    /// Deletes a package and all associated package versions. A deleted package cannot be restored. To delete one or more package versions, use the DeletePackageVersions API.
    @Sendable
    @inlinable
    public func deletePackage(_ input: DeletePackageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeletePackageResult {
        try await self.client.execute(
            operation: "DeletePackage", 
            path: "/v1/package", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a package and all associated package versions. A deleted package cannot be restored. To delete one or more package versions, use the DeletePackageVersions API.
    ///
    /// Parameters:
    ///   - domain: The name of the domain that contains the package to delete.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format: The format of the requested package to delete.
    ///   - namespace: The namespace of the package to delete. The package component that specifies its namespace depends on its type. For example:  The namespace is required when deleting packages of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package: The name of the package to delete.
    ///   - repository: The name of the repository that contains the package to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePackage(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeletePackageResult {
        let input = DeletePackageRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package, 
            repository: repository
        )
        return try await self.deletePackage(input, logger: logger)
    }

    /// Deletes a package group.  Deleting a package group does not delete packages or package versions associated with the package group.  When a package group is deleted, the direct child package groups will become children of the package  group's direct parent package group. Therefore, if any of the child groups are inheriting any settings  from the parent, those settings could change.
    @Sendable
    @inlinable
    public func deletePackageGroup(_ input: DeletePackageGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeletePackageGroupResult {
        try await self.client.execute(
            operation: "DeletePackageGroup", 
            path: "/v1/package-group", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a package group.  Deleting a package group does not delete packages or package versions associated with the package group.  When a package group is deleted, the direct child package groups will become children of the package  group's direct parent package group. Therefore, if any of the child groups are inheriting any settings  from the parent, those settings could change.
    ///
    /// Parameters:
    ///   - domain:  The domain that contains the package group to be deleted.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - packageGroup: The pattern of the package group to be deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePackageGroup(
        domain: String,
        domainOwner: String? = nil,
        packageGroup: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeletePackageGroupResult {
        let input = DeletePackageGroupRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            packageGroup: packageGroup
        )
        return try await self.deletePackageGroup(input, logger: logger)
    }

    ///  Deletes one or more versions of a package. A deleted package version cannot be restored in your repository. If you want to remove a package version from your repository and be able to restore it later, set its status to Archived. Archived packages cannot be downloaded from a repository and don't show up with list package APIs (for example, ListPackageVersions), but you can restore them using UpdatePackageVersionsStatus.
    @Sendable
    @inlinable
    public func deletePackageVersions(_ input: DeletePackageVersionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeletePackageVersionsResult {
        try await self.client.execute(
            operation: "DeletePackageVersions", 
            path: "/v1/package/versions/delete", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes one or more versions of a package. A deleted package version cannot be restored in your repository. If you want to remove a package version from your repository and be able to restore it later, set its status to Archived. Archived packages cannot be downloaded from a repository and don't show up with list package APIs (for example, ListPackageVersions), but you can restore them using UpdatePackageVersionsStatus.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the package to delete.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - expectedStatus:  The expected status of the package version to delete.
    ///   - format:  The format of the package versions to delete.
    ///   - namespace: The namespace of the package versions to be deleted. The package component that specifies its namespace depends on its type. For example:  The namespace is required when deleting package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the package with the versions to delete.
    ///   - repository:  The name of the repository that contains the package versions to delete.
    ///   - versions:  An array of strings that specify the versions of the package to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePackageVersions(
        domain: String,
        domainOwner: String? = nil,
        expectedStatus: PackageVersionStatus? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        repository: String,
        versions: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeletePackageVersionsResult {
        let input = DeletePackageVersionsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            expectedStatus: expectedStatus, 
            format: format, 
            namespace: namespace, 
            package: package, 
            repository: repository, 
            versions: versions
        )
        return try await self.deletePackageVersions(input, logger: logger)
    }

    ///  Deletes a repository.
    @Sendable
    @inlinable
    public func deleteRepository(_ input: DeleteRepositoryRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteRepositoryResult {
        try await self.client.execute(
            operation: "DeleteRepository", 
            path: "/v1/repository", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes a repository.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository to delete.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - repository:  The name of the repository to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteRepository(
        domain: String,
        domainOwner: String? = nil,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteRepositoryResult {
        let input = DeleteRepositoryRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            repository: repository
        )
        return try await self.deleteRepository(input, logger: logger)
    }

    ///  Deletes the resource policy that is set on a repository. After a resource policy is deleted, the permissions allowed and denied by the deleted policy are removed. The effect of deleting a resource policy might not be immediate.    Use DeleteRepositoryPermissionsPolicy with caution. After a policy is deleted, Amazon Web Services users, roles, and accounts lose permissions to perform the repository actions granted by the deleted policy.
    @Sendable
    @inlinable
    public func deleteRepositoryPermissionsPolicy(_ input: DeleteRepositoryPermissionsPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteRepositoryPermissionsPolicyResult {
        try await self.client.execute(
            operation: "DeleteRepositoryPermissionsPolicy", 
            path: "/v1/repository/permissions/policies", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes the resource policy that is set on a repository. After a resource policy is deleted, the permissions allowed and denied by the deleted policy are removed. The effect of deleting a resource policy might not be immediate.    Use DeleteRepositoryPermissionsPolicy with caution. After a policy is deleted, Amazon Web Services users, roles, and accounts lose permissions to perform the repository actions granted by the deleted policy.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository associated with the resource policy to be deleted.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - policyRevision:  The revision of the repository's resource policy to be deleted. This revision is used for optimistic locking, which prevents others from accidentally overwriting your changes to the repository's resource policy.
    ///   - repository:  The name of the repository that is associated with the resource policy to be deleted
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteRepositoryPermissionsPolicy(
        domain: String,
        domainOwner: String? = nil,
        policyRevision: String? = nil,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteRepositoryPermissionsPolicyResult {
        let input = DeleteRepositoryPermissionsPolicyRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            policyRevision: policyRevision, 
            repository: repository
        )
        return try await self.deleteRepositoryPermissionsPolicy(input, logger: logger)
    }

    ///  Returns a  DomainDescription  object that contains information about the requested domain.
    @Sendable
    @inlinable
    public func describeDomain(_ input: DescribeDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeDomainResult {
        try await self.client.execute(
            operation: "DescribeDomain", 
            path: "/v1/domain", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a  DomainDescription  object that contains information about the requested domain.
    ///
    /// Parameters:
    ///   - domain:  A string that specifies the name of the requested domain.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeDomain(
        domain: String,
        domainOwner: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeDomainResult {
        let input = DescribeDomainRequest(
            domain: domain, 
            domainOwner: domainOwner
        )
        return try await self.describeDomain(input, logger: logger)
    }

    ///  Returns a  PackageDescription  object that contains information about the requested package.
    @Sendable
    @inlinable
    public func describePackage(_ input: DescribePackageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePackageResult {
        try await self.client.execute(
            operation: "DescribePackage", 
            path: "/v1/package", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a  PackageDescription  object that contains information about the requested package.
    ///
    /// Parameters:
    ///   - domain: The name of the domain that contains the repository that contains the package.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format: A format that specifies the type of the requested package.
    ///   - namespace: The namespace of the requested package. The package component that specifies its namespace depends on its type. For example:  The namespace is required when requesting packages of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package: The name of the requested package.
    ///   - repository: The name of the repository that contains the requested package.
    ///   - logger: Logger use during operation
    @inlinable
    public func describePackage(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePackageResult {
        let input = DescribePackageRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package, 
            repository: repository
        )
        return try await self.describePackage(input, logger: logger)
    }

    /// Returns a PackageGroupDescription object that  contains information about the requested package group.
    @Sendable
    @inlinable
    public func describePackageGroup(_ input: DescribePackageGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePackageGroupResult {
        try await self.client.execute(
            operation: "DescribePackageGroup", 
            path: "/v1/package-group", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a PackageGroupDescription object that  contains information about the requested package group.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the package group.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - packageGroup: The pattern of the requested package group.
    ///   - logger: Logger use during operation
    @inlinable
    public func describePackageGroup(
        domain: String,
        domainOwner: String? = nil,
        packageGroup: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePackageGroupResult {
        let input = DescribePackageGroupRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            packageGroup: packageGroup
        )
        return try await self.describePackageGroup(input, logger: logger)
    }

    ///  Returns a  PackageVersionDescription  object that contains information about the requested package version.
    @Sendable
    @inlinable
    public func describePackageVersion(_ input: DescribePackageVersionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePackageVersionResult {
        try await self.client.execute(
            operation: "DescribePackageVersion", 
            path: "/v1/package/version", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a  PackageVersionDescription  object that contains information about the requested package version.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the package version.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  A format that specifies the type of the requested package version.
    ///   - namespace: The namespace of the requested package version. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when requesting package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the requested package version.
    ///   - packageVersion:  A string that contains the package version (for example, 3.5.2).
    ///   - repository:  The name of the repository that contains the package version.
    ///   - logger: Logger use during operation
    @inlinable
    public func describePackageVersion(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        packageVersion: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePackageVersionResult {
        let input = DescribePackageVersionRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package, 
            packageVersion: packageVersion, 
            repository: repository
        )
        return try await self.describePackageVersion(input, logger: logger)
    }

    ///  Returns a RepositoryDescription object that contains detailed information  about the requested repository.
    @Sendable
    @inlinable
    public func describeRepository(_ input: DescribeRepositoryRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRepositoryResult {
        try await self.client.execute(
            operation: "DescribeRepository", 
            path: "/v1/repository", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a RepositoryDescription object that contains detailed information  about the requested repository.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository to describe.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - repository:  A string that specifies the name of the requested repository.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRepository(
        domain: String,
        domainOwner: String? = nil,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRepositoryResult {
        let input = DescribeRepositoryRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            repository: repository
        )
        return try await self.describeRepository(input, logger: logger)
    }

    ///  Removes an existing external connection from a repository.
    @Sendable
    @inlinable
    public func disassociateExternalConnection(_ input: DisassociateExternalConnectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateExternalConnectionResult {
        try await self.client.execute(
            operation: "DisassociateExternalConnection", 
            path: "/v1/repository/external-connection", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Removes an existing external connection from a repository.
    ///
    /// Parameters:
    ///   - domain: The name of the domain that contains the repository from which to remove the external repository.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - externalConnection: The name of the external connection to be removed from the repository.
    ///   - repository: The name of the repository from which the external connection will be removed.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateExternalConnection(
        domain: String,
        domainOwner: String? = nil,
        externalConnection: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateExternalConnectionResult {
        let input = DisassociateExternalConnectionRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            externalConnection: externalConnection, 
            repository: repository
        )
        return try await self.disassociateExternalConnection(input, logger: logger)
    }

    ///  Deletes the assets in package versions and sets the package versions' status to Disposed. A disposed package version cannot be restored in your repository because its assets are deleted.   To view all disposed package versions in a repository, use ListPackageVersions and set the  status parameter  to Disposed.   To view information about a disposed package version, use DescribePackageVersion.
    @Sendable
    @inlinable
    public func disposePackageVersions(_ input: DisposePackageVersionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisposePackageVersionsResult {
        try await self.client.execute(
            operation: "DisposePackageVersions", 
            path: "/v1/package/versions/dispose", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes the assets in package versions and sets the package versions' status to Disposed. A disposed package version cannot be restored in your repository because its assets are deleted.   To view all disposed package versions in a repository, use ListPackageVersions and set the  status parameter  to Disposed.   To view information about a disposed package version, use DescribePackageVersion.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository you want to dispose.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - expectedStatus:  The expected status of the package version to dispose.
    ///   - format:  A format that specifies the type of package versions you want to dispose.
    ///   - namespace: The namespace of the package versions to be disposed. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when disposing package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the package with the versions you want to dispose.
    ///   - repository:  The name of the repository that contains the package versions you want to dispose.
    ///   - versionRevisions:  The revisions of the package versions you want to dispose.
    ///   - versions:  The versions of the package you want to dispose.
    ///   - logger: Logger use during operation
    @inlinable
    public func disposePackageVersions(
        domain: String,
        domainOwner: String? = nil,
        expectedStatus: PackageVersionStatus? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        repository: String,
        versionRevisions: [String: String]? = nil,
        versions: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisposePackageVersionsResult {
        let input = DisposePackageVersionsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            expectedStatus: expectedStatus, 
            format: format, 
            namespace: namespace, 
            package: package, 
            repository: repository, 
            versionRevisions: versionRevisions, 
            versions: versions
        )
        return try await self.disposePackageVersions(input, logger: logger)
    }

    /// Returns the most closely associated package group to the specified package. This API does not require that the package exist  in any repository in the domain. As such, GetAssociatedPackageGroup can be used to see which package group's origin configuration  applies to a package before that package is in a repository. This can be helpful to check if public packages are blocked without ingesting them. For information package group association and matching, see  Package group  definition syntax and matching behavior in the CodeArtifact User Guide.
    @Sendable
    @inlinable
    public func getAssociatedPackageGroup(_ input: GetAssociatedPackageGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAssociatedPackageGroupResult {
        try await self.client.execute(
            operation: "GetAssociatedPackageGroup", 
            path: "/v1/get-associated-package-group", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the most closely associated package group to the specified package. This API does not require that the package exist  in any repository in the domain. As such, GetAssociatedPackageGroup can be used to see which package group's origin configuration  applies to a package before that package is in a repository. This can be helpful to check if public packages are blocked without ingesting them. For information package group association and matching, see  Package group  definition syntax and matching behavior in the CodeArtifact User Guide.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the package from which to get the associated package group.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  The format of the package from which to get the associated package group.
    ///   - namespace: The namespace of the package from which to get the associated package group. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when getting associated package groups from packages of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The package from which to get the associated package group.
    ///   - logger: Logger use during operation
    @inlinable
    public func getAssociatedPackageGroup(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAssociatedPackageGroupResult {
        let input = GetAssociatedPackageGroupRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package
        )
        return try await self.getAssociatedPackageGroup(input, logger: logger)
    }

    ///  Generates a temporary authorization token for accessing repositories in the domain.  This API requires the codeartifact:GetAuthorizationToken and sts:GetServiceBearerToken permissions.  For more information about authorization tokens, see  CodeArtifact authentication and tokens.   CodeArtifact authorization tokens are valid for a period of 12 hours when created with the login command.  You can call login periodically to refresh the token. When  you create an authorization token with the GetAuthorizationToken API, you can set a custom authorization period,  up to a maximum of 12 hours, with the durationSeconds parameter. The authorization period begins after login  or GetAuthorizationToken is called. If login or GetAuthorizationToken is called while  assuming a role, the token lifetime is independent of the maximum session duration  of the role. For example, if you call sts assume-role and specify a session duration of 15 minutes, then  generate a CodeArtifact authorization token, the token will be valid for the full authorization period  even though this is longer than the 15-minute session duration. See  Using IAM Roles  for more information on controlling session duration.
    @Sendable
    @inlinable
    public func getAuthorizationToken(_ input: GetAuthorizationTokenRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAuthorizationTokenResult {
        try await self.client.execute(
            operation: "GetAuthorizationToken", 
            path: "/v1/authorization-token", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Generates a temporary authorization token for accessing repositories in the domain.  This API requires the codeartifact:GetAuthorizationToken and sts:GetServiceBearerToken permissions.  For more information about authorization tokens, see  CodeArtifact authentication and tokens.   CodeArtifact authorization tokens are valid for a period of 12 hours when created with the login command.  You can call login periodically to refresh the token. When  you create an authorization token with the GetAuthorizationToken API, you can set a custom authorization period,  up to a maximum of 12 hours, with the durationSeconds parameter. The authorization period begins after login  or GetAuthorizationToken is called. If login or GetAuthorizationToken is called while  assuming a role, the token lifetime is independent of the maximum session duration  of the role. For example, if you call sts assume-role and specify a session duration of 15 minutes, then  generate a CodeArtifact authorization token, the token will be valid for the full authorization period  even though this is longer than the 15-minute session duration. See  Using IAM Roles  for more information on controlling session duration.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that is in scope for the generated authorization token.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - durationSeconds: The time, in seconds, that the generated authorization token is valid. Valid values are  0 and any number between 900 (15 minutes) and 43200 (12 hours).  A value of 0 will set the expiration of the authorization token to the same expiration of  the user's role's temporary credentials.
    ///   - logger: Logger use during operation
    @inlinable
    public func getAuthorizationToken(
        domain: String,
        domainOwner: String? = nil,
        durationSeconds: Int64? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAuthorizationTokenResult {
        let input = GetAuthorizationTokenRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            durationSeconds: durationSeconds
        )
        return try await self.getAuthorizationToken(input, logger: logger)
    }

    ///  Returns the resource policy attached to the specified domain.    The policy is a resource-based policy, not an identity-based policy. For more information, see Identity-based policies and resource-based policies  in the IAM User Guide.
    @Sendable
    @inlinable
    public func getDomainPermissionsPolicy(_ input: GetDomainPermissionsPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetDomainPermissionsPolicyResult {
        try await self.client.execute(
            operation: "GetDomainPermissionsPolicy", 
            path: "/v1/domain/permissions/policy", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns the resource policy attached to the specified domain.    The policy is a resource-based policy, not an identity-based policy. For more information, see Identity-based policies and resource-based policies  in the IAM User Guide.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain to which the resource policy is attached.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - logger: Logger use during operation
    @inlinable
    public func getDomainPermissionsPolicy(
        domain: String,
        domainOwner: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetDomainPermissionsPolicyResult {
        let input = GetDomainPermissionsPolicyRequest(
            domain: domain, 
            domainOwner: domainOwner
        )
        return try await self.getDomainPermissionsPolicy(input, logger: logger)
    }

    ///  Returns an asset (or file) that is in a package. For example, for a Maven package version, use  GetPackageVersionAsset to download a JAR file, a POM file,  or any other assets in the package version.
    @Sendable
    @inlinable
    public func getPackageVersionAsset(_ input: GetPackageVersionAssetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetPackageVersionAssetResult {
        try await self.client.execute(
            operation: "GetPackageVersionAsset", 
            path: "/v1/package/version/asset", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns an asset (or file) that is in a package. For example, for a Maven package version, use  GetPackageVersionAsset to download a JAR file, a POM file,  or any other assets in the package version.
    ///
    /// Parameters:
    ///   - asset:  The name of the requested asset.
    ///   - domain:  The name of the domain that contains the repository that contains the package version with the requested asset.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  A format that specifies the type of the package version with the requested asset file.
    ///   - namespace: The namespace of the package version with the requested asset file. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when requesting assets from package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the package that contains the requested asset.
    ///   - packageVersion:  A string that contains the package version (for example, 3.5.2).
    ///   - packageVersionRevision:  The name of the package version revision that contains the requested asset.
    ///   - repository:  The repository that contains the package version with the requested asset.
    ///   - logger: Logger use during operation
    @inlinable
    public func getPackageVersionAsset(
        asset: String,
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        packageVersion: String,
        packageVersionRevision: String? = nil,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetPackageVersionAssetResult {
        let input = GetPackageVersionAssetRequest(
            asset: asset, 
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package, 
            packageVersion: packageVersion, 
            packageVersionRevision: packageVersionRevision, 
            repository: repository
        )
        return try await self.getPackageVersionAsset(input, logger: logger)
    }

    ///  Gets the readme file or descriptive text for a package version.   The returned text might contain formatting. For example, it might contain formatting for Markdown or reStructuredText.
    @Sendable
    @inlinable
    public func getPackageVersionReadme(_ input: GetPackageVersionReadmeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetPackageVersionReadmeResult {
        try await self.client.execute(
            operation: "GetPackageVersionReadme", 
            path: "/v1/package/version/readme", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Gets the readme file or descriptive text for a package version.   The returned text might contain formatting. For example, it might contain formatting for Markdown or reStructuredText.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the package version with the requested readme file.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  A format that specifies the type of the package version with the requested readme file.
    ///   - namespace: The namespace of the package version with the requested readme file. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when requesting the readme from package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the package version that contains the requested readme file.
    ///   - packageVersion:  A string that contains the package version (for example, 3.5.2).
    ///   - repository:  The repository that contains the package with the requested readme file.
    ///   - logger: Logger use during operation
    @inlinable
    public func getPackageVersionReadme(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        packageVersion: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetPackageVersionReadmeResult {
        let input = GetPackageVersionReadmeRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package, 
            packageVersion: packageVersion, 
            repository: repository
        )
        return try await self.getPackageVersionReadme(input, logger: logger)
    }

    ///  Returns the endpoint of a repository for a specific package format. A repository has one endpoint for each  package format:     cargo     generic     maven     npm     nuget     pypi     ruby     swift
    @Sendable
    @inlinable
    public func getRepositoryEndpoint(_ input: GetRepositoryEndpointRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetRepositoryEndpointResult {
        try await self.client.execute(
            operation: "GetRepositoryEndpoint", 
            path: "/v1/repository/endpoint", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns the endpoint of a repository for a specific package format. A repository has one endpoint for each  package format:     cargo     generic     maven     npm     nuget     pypi     ruby     swift
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain that contains the repository. It does not include  dashes or spaces.
    ///   - endpointType: A string that specifies the type of endpoint.
    ///   - format:  Returns which endpoint of a repository to return. A repository has one endpoint for each  package format.
    ///   - repository:  The name of the repository.
    ///   - logger: Logger use during operation
    @inlinable
    public func getRepositoryEndpoint(
        domain: String,
        domainOwner: String? = nil,
        endpointType: EndpointType? = nil,
        format: PackageFormat,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetRepositoryEndpointResult {
        let input = GetRepositoryEndpointRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            endpointType: endpointType, 
            format: format, 
            repository: repository
        )
        return try await self.getRepositoryEndpoint(input, logger: logger)
    }

    ///  Returns the resource policy that is set on a repository.
    @Sendable
    @inlinable
    public func getRepositoryPermissionsPolicy(_ input: GetRepositoryPermissionsPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetRepositoryPermissionsPolicyResult {
        try await self.client.execute(
            operation: "GetRepositoryPermissionsPolicy", 
            path: "/v1/repository/permissions/policy", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns the resource policy that is set on a repository.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain containing the repository whose associated resource policy is to be retrieved.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - repository:  The name of the repository whose associated resource policy is to be retrieved.
    ///   - logger: Logger use during operation
    @inlinable
    public func getRepositoryPermissionsPolicy(
        domain: String,
        domainOwner: String? = nil,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetRepositoryPermissionsPolicyResult {
        let input = GetRepositoryPermissionsPolicyRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            repository: repository
        )
        return try await self.getRepositoryPermissionsPolicy(input, logger: logger)
    }

    /// Lists the repositories in the added repositories list of the specified restriction type for a package group. For more information about restriction types  and added repository lists, see Package group origin controls in the CodeArtifact User Guide.
    @Sendable
    @inlinable
    public func listAllowedRepositoriesForGroup(_ input: ListAllowedRepositoriesForGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAllowedRepositoriesForGroupResult {
        try await self.client.execute(
            operation: "ListAllowedRepositoriesForGroup", 
            path: "/v1/package-group-allowed-repositories", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the repositories in the added repositories list of the specified restriction type for a package group. For more information about restriction types  and added repository lists, see Package group origin controls in the CodeArtifact User Guide.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the package group from which to list allowed repositories.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - originRestrictionType: The origin configuration restriction type of which to list allowed repositories.
    ///   - packageGroup: The pattern of the package group from which to list allowed repositories.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAllowedRepositoriesForGroup(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        originRestrictionType: PackageGroupOriginRestrictionType,
        packageGroup: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAllowedRepositoriesForGroupResult {
        let input = ListAllowedRepositoriesForGroupRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            originRestrictionType: originRestrictionType, 
            packageGroup: packageGroup
        )
        return try await self.listAllowedRepositoriesForGroup(input, logger: logger)
    }

    /// Returns a list of packages associated with the requested package group. For information package group association and matching, see  Package group  definition syntax and matching behavior in the CodeArtifact User Guide.
    @Sendable
    @inlinable
    public func listAssociatedPackages(_ input: ListAssociatedPackagesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAssociatedPackagesResult {
        try await self.client.execute(
            operation: "ListAssociatedPackages", 
            path: "/v1/list-associated-packages", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of packages associated with the requested package group. For information package group association and matching, see  Package group  definition syntax and matching behavior in the CodeArtifact User Guide.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the package group from which to list associated packages.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - packageGroup:  The pattern of the package group from which to list associated packages.
    ///   - preview:  When this flag is included, ListAssociatedPackages will return a list of packages that would be associated with a package  group, even if it does not exist.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAssociatedPackages(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        packageGroup: String,
        preview: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAssociatedPackagesResult {
        let input = ListAssociatedPackagesRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            packageGroup: packageGroup, 
            preview: preview
        )
        return try await self.listAssociatedPackages(input, logger: logger)
    }

    ///  Returns a list of DomainSummary objects for all domains owned by the Amazon Web Services account that makes this call. Each returned DomainSummary object contains information about a domain.
    @Sendable
    @inlinable
    public func listDomains(_ input: ListDomainsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListDomainsResult {
        try await self.client.execute(
            operation: "ListDomains", 
            path: "/v1/domains", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a list of DomainSummary objects for all domains owned by the Amazon Web Services account that makes this call. Each returned DomainSummary object contains information about a domain.
    ///
    /// Parameters:
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - logger: Logger use during operation
    @inlinable
    public func listDomains(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListDomainsResult {
        let input = ListDomainsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listDomains(input, logger: logger)
    }

    /// Returns a list of package groups in the requested domain.
    @Sendable
    @inlinable
    public func listPackageGroups(_ input: ListPackageGroupsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPackageGroupsResult {
        try await self.client.execute(
            operation: "ListPackageGroups", 
            path: "/v1/package-groups", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of package groups in the requested domain.
    ///
    /// Parameters:
    ///   - domain:  The domain for which you want to list package groups.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - prefix:  A prefix for which to search package groups. When included, ListPackageGroups will return only package groups with patterns that match the prefix.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPackageGroups(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        prefix: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPackageGroupsResult {
        let input = ListPackageGroupsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            prefix: prefix
        )
        return try await self.listPackageGroups(input, logger: logger)
    }

    ///  Returns a list of  AssetSummary  objects for assets in a package version.
    @Sendable
    @inlinable
    public func listPackageVersionAssets(_ input: ListPackageVersionAssetsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPackageVersionAssetsResult {
        try await self.client.execute(
            operation: "ListPackageVersionAssets", 
            path: "/v1/package/version/assets", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a list of  AssetSummary  objects for assets in a package version.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository associated with the package version assets.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  The format of the package that contains the requested package version assets.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - namespace: The namespace of the package version that contains the requested package version assets. The package component that specifies its  namespace depends on its type. For example:  The namespace is required requesting assets from package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - package:  The name of the package that contains the requested package version assets.
    ///   - packageVersion:  A string that contains the package version (for example, 3.5.2).
    ///   - repository:  The name of the repository that contains the package that contains the requested package version assets.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPackageVersionAssets(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        maxResults: Int? = nil,
        namespace: String? = nil,
        nextToken: String? = nil,
        package: String,
        packageVersion: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPackageVersionAssetsResult {
        let input = ListPackageVersionAssetsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            maxResults: maxResults, 
            namespace: namespace, 
            nextToken: nextToken, 
            package: package, 
            packageVersion: packageVersion, 
            repository: repository
        )
        return try await self.listPackageVersionAssets(input, logger: logger)
    }

    ///  Returns the direct dependencies for a package version. The dependencies are returned as  PackageDependency  objects. CodeArtifact extracts the dependencies for a package version from the metadata file for the package  format (for example, the package.json file for npm packages and the pom.xml file  for Maven). Any package version dependencies that are not listed in the configuration file are not returned.
    @Sendable
    @inlinable
    public func listPackageVersionDependencies(_ input: ListPackageVersionDependenciesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPackageVersionDependenciesResult {
        try await self.client.execute(
            operation: "ListPackageVersionDependencies", 
            path: "/v1/package/version/dependencies", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns the direct dependencies for a package version. The dependencies are returned as  PackageDependency  objects. CodeArtifact extracts the dependencies for a package version from the metadata file for the package  format (for example, the package.json file for npm packages and the pom.xml file  for Maven). Any package version dependencies that are not listed in the configuration file are not returned.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the requested package version dependencies.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  The format of the package with the requested dependencies.
    ///   - namespace: The namespace of the package version with the requested dependencies. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when listing dependencies from package versions of the following formats:   Maven       The namespace of a Maven package version is its groupId.     The namespace of an npm package version is its scope.     Python and NuGet package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - package:  The name of the package versions' package.
    ///   - packageVersion:  A string that contains the package version (for example, 3.5.2).
    ///   - repository:  The name of the repository that contains the requested package version.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPackageVersionDependencies(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        nextToken: String? = nil,
        package: String,
        packageVersion: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPackageVersionDependenciesResult {
        let input = ListPackageVersionDependenciesRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            nextToken: nextToken, 
            package: package, 
            packageVersion: packageVersion, 
            repository: repository
        )
        return try await self.listPackageVersionDependencies(input, logger: logger)
    }

    ///  Returns a list of  PackageVersionSummary  objects for package versions in a repository that match the request parameters. Package versions of all statuses will be returned by default when calling list-package-versions with no  --status parameter.
    @Sendable
    @inlinable
    public func listPackageVersions(_ input: ListPackageVersionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPackageVersionsResult {
        try await self.client.execute(
            operation: "ListPackageVersions", 
            path: "/v1/package/versions", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a list of  PackageVersionSummary  objects for package versions in a repository that match the request parameters. Package versions of all statuses will be returned by default when calling list-package-versions with no  --status parameter.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the requested package versions.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  The format of the package versions you want to list.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - namespace: The namespace of the package that contains the requested package versions. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when deleting package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - originType: The originType used to filter package versions.  Only package versions with the provided originType will be returned.
    ///   - package:  The name of the package for which you want to request package versions.
    ///   - repository:  The name of the repository that contains the requested package versions.
    ///   - sortBy:  How to sort the requested list of package versions.
    ///   - status:  A string that filters the requested package versions by status.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPackageVersions(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        maxResults: Int? = nil,
        namespace: String? = nil,
        nextToken: String? = nil,
        originType: PackageVersionOriginType? = nil,
        package: String,
        repository: String,
        sortBy: PackageVersionSortType? = nil,
        status: PackageVersionStatus? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPackageVersionsResult {
        let input = ListPackageVersionsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            maxResults: maxResults, 
            namespace: namespace, 
            nextToken: nextToken, 
            originType: originType, 
            package: package, 
            repository: repository, 
            sortBy: sortBy, 
            status: status
        )
        return try await self.listPackageVersions(input, logger: logger)
    }

    ///  Returns a list of  PackageSummary  objects for packages in a repository that match the request parameters.
    @Sendable
    @inlinable
    public func listPackages(_ input: ListPackagesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPackagesResult {
        try await self.client.execute(
            operation: "ListPackages", 
            path: "/v1/packages", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a list of  PackageSummary  objects for packages in a repository that match the request parameters.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the requested packages.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format: The format used to filter requested packages. Only packages from the provided format will be returned.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - namespace: The namespace prefix used to filter requested packages.  Only packages with a namespace that starts with the provided string value are returned.  Note that although this option is called --namespace and not --namespace-prefix, it has prefix-matching behavior. Each package format uses namespace as follows:    The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - packagePrefix:  A prefix used to filter requested packages. Only packages with names that start with  packagePrefix are returned.
    ///   - publish: The value of the Publish package origin control restriction used to filter requested packages.  Only packages with the provided restriction are returned.  For more information, see PackageOriginRestrictions.
    ///   - repository:  The name of the repository that contains the requested packages.
    ///   - upstream: The value of the Upstream package origin control restriction used to filter requested packages.  Only packages with the provided restriction are returned. For more information, see PackageOriginRestrictions.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPackages(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat? = nil,
        maxResults: Int? = nil,
        namespace: String? = nil,
        nextToken: String? = nil,
        packagePrefix: String? = nil,
        publish: AllowPublish? = nil,
        repository: String,
        upstream: AllowUpstream? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPackagesResult {
        let input = ListPackagesRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            maxResults: maxResults, 
            namespace: namespace, 
            nextToken: nextToken, 
            packagePrefix: packagePrefix, 
            publish: publish, 
            repository: repository, 
            upstream: upstream
        )
        return try await self.listPackages(input, logger: logger)
    }

    ///  Returns a list of  RepositorySummary  objects. Each RepositorySummary contains information about a repository in the specified Amazon Web Services account and that matches the input  parameters.
    @Sendable
    @inlinable
    public func listRepositories(_ input: ListRepositoriesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListRepositoriesResult {
        try await self.client.execute(
            operation: "ListRepositories", 
            path: "/v1/repositories", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a list of  RepositorySummary  objects. Each RepositorySummary contains information about a repository in the specified Amazon Web Services account and that matches the input  parameters.
    ///
    /// Parameters:
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - repositoryPrefix:  A prefix used to filter returned repositories. Only repositories with names that start with repositoryPrefix are returned.
    ///   - logger: Logger use during operation
    @inlinable
    public func listRepositories(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        repositoryPrefix: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListRepositoriesResult {
        let input = ListRepositoriesRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            repositoryPrefix: repositoryPrefix
        )
        return try await self.listRepositories(input, logger: logger)
    }

    ///  Returns a list of  RepositorySummary  objects. Each RepositorySummary contains information about a repository in the specified domain and that matches the input  parameters.
    @Sendable
    @inlinable
    public func listRepositoriesInDomain(_ input: ListRepositoriesInDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListRepositoriesInDomainResult {
        try await self.client.execute(
            operation: "ListRepositoriesInDomain", 
            path: "/v1/domain/repositories", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a list of  RepositorySummary  objects. Each RepositorySummary contains information about a repository in the specified domain and that matches the input  parameters.
    ///
    /// Parameters:
    ///   - administratorAccount:  Filter the list of repositories to only include those that are managed by the Amazon Web Services account ID.
    ///   - domain:  The name of the domain that contains the returned list of repositories.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - repositoryPrefix:  A prefix used to filter returned repositories. Only repositories with names that start with  repositoryPrefix are returned.
    ///   - logger: Logger use during operation
    @inlinable
    public func listRepositoriesInDomain(
        administratorAccount: String? = nil,
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        repositoryPrefix: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListRepositoriesInDomainResult {
        let input = ListRepositoriesInDomainRequest(
            administratorAccount: administratorAccount, 
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            repositoryPrefix: repositoryPrefix
        )
        return try await self.listRepositoriesInDomain(input, logger: logger)
    }

    /// Returns a list of direct children of the specified package group. For information package group hierarchy, see  Package group  definition syntax and matching behavior in the CodeArtifact User Guide.
    @Sendable
    @inlinable
    public func listSubPackageGroups(_ input: ListSubPackageGroupsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListSubPackageGroupsResult {
        try await self.client.execute(
            operation: "ListSubPackageGroups", 
            path: "/v1/package-groups/sub-groups", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of direct children of the specified package group. For information package group hierarchy, see  Package group  definition syntax and matching behavior in the CodeArtifact User Guide.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain which contains the package group from which to list sub package groups.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - nextToken:  The token for the next set of results. Use the value returned in the previous response in the next request to retrieve the next set of results.
    ///   - packageGroup:  The pattern of the package group from which to list sub package groups.
    ///   - logger: Logger use during operation
    @inlinable
    public func listSubPackageGroups(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        packageGroup: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListSubPackageGroupsResult {
        let input = ListSubPackageGroupsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            packageGroup: packageGroup
        )
        return try await self.listSubPackageGroups(input, logger: logger)
    }

    /// Gets information about Amazon Web Services tags for a specified Amazon Resource Name (ARN) in CodeArtifact.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResult {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/v1/tags", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about Amazon Web Services tags for a specified Amazon Resource Name (ARN) in CodeArtifact.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource to get tags for.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResult {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Creates a new package version containing one or more assets (or files). The unfinished flag can be used to keep the package version in the Unfinished state until all of its assets have been uploaded (see Package version status in the CodeArtifact user guide). To set the package version’s status to Published, omit the unfinished flag when uploading the final asset, or set the status using UpdatePackageVersionStatus. Once a package version’s status is set to Published, it cannot change back to Unfinished.  Only generic packages can be published using this API. For more information, see Using generic packages in the CodeArtifact User Guide.
    @Sendable
    @inlinable
    public func publishPackageVersion(_ input: PublishPackageVersionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PublishPackageVersionResult {
        try await self.client.execute(
            operation: "PublishPackageVersion", 
            path: "/v1/package/version/publish", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new package version containing one or more assets (or files). The unfinished flag can be used to keep the package version in the Unfinished state until all of its assets have been uploaded (see Package version status in the CodeArtifact user guide). To set the package version’s status to Published, omit the unfinished flag when uploading the final asset, or set the status using UpdatePackageVersionStatus. Once a package version’s status is set to Published, it cannot change back to Unfinished.  Only generic packages can be published using this API. For more information, see Using generic packages in the CodeArtifact User Guide.
    ///
    /// Parameters:
    ///   - assetContent: The content of the asset to publish.
    ///   - assetName: The name of the asset to publish. Asset names can include Unicode letters and numbers, and the following special characters: ~ ! @ ^ & ( ) - ` _ + [ ] { } ; , . `
    ///   - assetSHA256: The SHA256 hash of the assetContent to publish. This value must be calculated by the caller and provided with the request (see Publishing a generic package in the CodeArtifact User Guide). This value is used as an integrity check to verify that the assetContent has not changed after it was originally sent.
    ///   - domain: The name of the domain that contains the repository that contains the package version to publish.
    ///   - domainOwner: The 12-digit account number of the AWS account that owns the domain. It does not include dashes or spaces.
    ///   - format: A format that specifies the type of the package version with the requested asset file. The only supported value is generic.
    ///   - namespace: The namespace of the package version to publish.
    ///   - package: The name of the package version to publish.
    ///   - packageVersion: The package version to publish (for example, 3.5.2).
    ///   - repository: The name of the repository that the package version will be published to.
    ///   - unfinished: Specifies whether the package version should remain in the unfinished state. If omitted, the package version status will be set to Published (see Package version status in the CodeArtifact User Guide). Valid values: unfinished
    ///   - logger: Logger use during operation
    @inlinable
    public func publishPackageVersion(
        assetContent: AWSHTTPBody,
        assetName: String,
        assetSHA256: String,
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        packageVersion: String,
        repository: String,
        unfinished: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PublishPackageVersionResult {
        let input = PublishPackageVersionRequest(
            assetContent: assetContent, 
            assetName: assetName, 
            assetSHA256: assetSHA256, 
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package, 
            packageVersion: packageVersion, 
            repository: repository, 
            unfinished: unfinished
        )
        return try await self.publishPackageVersion(input, logger: logger)
    }

    ///  Sets a resource policy on a domain that specifies permissions to access it.   When you call PutDomainPermissionsPolicy, the resource policy on the domain is ignored when evaluting permissions.  This ensures that the owner of a domain cannot lock themselves out of the domain, which would prevent them from being  able to update the resource policy.
    @Sendable
    @inlinable
    public func putDomainPermissionsPolicy(_ input: PutDomainPermissionsPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutDomainPermissionsPolicyResult {
        try await self.client.execute(
            operation: "PutDomainPermissionsPolicy", 
            path: "/v1/domain/permissions/policy", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Sets a resource policy on a domain that specifies permissions to access it.   When you call PutDomainPermissionsPolicy, the resource policy on the domain is ignored when evaluting permissions.  This ensures that the owner of a domain cannot lock themselves out of the domain, which would prevent them from being  able to update the resource policy.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain on which to set the resource policy.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - policyDocument:  A valid displayable JSON Aspen policy string to be set as the access control resource policy on the provided domain.
    ///   - policyRevision:  The current revision of the resource policy to be set. This revision is used for optimistic locking, which prevents others from overwriting your changes to the domain's resource policy.
    ///   - logger: Logger use during operation
    @inlinable
    public func putDomainPermissionsPolicy(
        domain: String,
        domainOwner: String? = nil,
        policyDocument: String,
        policyRevision: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutDomainPermissionsPolicyResult {
        let input = PutDomainPermissionsPolicyRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            policyDocument: policyDocument, 
            policyRevision: policyRevision
        )
        return try await self.putDomainPermissionsPolicy(input, logger: logger)
    }

    /// Sets the package origin configuration for a package. The package origin configuration determines how new versions of a package can be added to a repository. You can allow or block direct  publishing of new package versions, or ingestion and retaining of new package versions from an external connection or upstream source.  For more information about package origin controls and configuration, see Editing package origin controls in the CodeArtifact User Guide.  PutPackageOriginConfiguration can be called on a package that doesn't yet exist in the repository. When called  on a package that does not exist, a package is created in the repository with no versions and the requested restrictions are set on the package.  This can be used to preemptively block ingesting or retaining any versions from external connections or upstream repositories, or to block  publishing any versions of the package into the repository before connecting any package managers or publishers to the repository.
    @Sendable
    @inlinable
    public func putPackageOriginConfiguration(_ input: PutPackageOriginConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutPackageOriginConfigurationResult {
        try await self.client.execute(
            operation: "PutPackageOriginConfiguration", 
            path: "/v1/package", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets the package origin configuration for a package. The package origin configuration determines how new versions of a package can be added to a repository. You can allow or block direct  publishing of new package versions, or ingestion and retaining of new package versions from an external connection or upstream source.  For more information about package origin controls and configuration, see Editing package origin controls in the CodeArtifact User Guide.  PutPackageOriginConfiguration can be called on a package that doesn't yet exist in the repository. When called  on a package that does not exist, a package is created in the repository with no versions and the requested restrictions are set on the package.  This can be used to preemptively block ingesting or retaining any versions from external connections or upstream repositories, or to block  publishing any versions of the package into the repository before connecting any package managers or publishers to the repository.
    ///
    /// Parameters:
    ///   - domain: The name of the domain that contains the repository that contains the package.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format: A format that specifies the type of the package to be updated.
    ///   - namespace: The namespace of the package to be updated. The package component that specifies its  namespace depends on its type. For example:    The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package: The name of the package to be updated.
    ///   - repository: The name of the repository that contains the package.
    ///   - restrictions: A PackageOriginRestrictions  object that contains information about the upstream and publish package origin restrictions.  The upstream restriction determines if new package versions can be ingested or retained from external connections or upstream repositories.  The publish restriction determines if new package versions can be published directly to the repository. You must include both the desired upstream and publish restrictions.
    ///   - logger: Logger use during operation
    @inlinable
    public func putPackageOriginConfiguration(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        repository: String,
        restrictions: PackageOriginRestrictions,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutPackageOriginConfigurationResult {
        let input = PutPackageOriginConfigurationRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            namespace: namespace, 
            package: package, 
            repository: repository, 
            restrictions: restrictions
        )
        return try await self.putPackageOriginConfiguration(input, logger: logger)
    }

    ///  Sets the resource policy on a repository that specifies permissions to access it.   When you call PutRepositoryPermissionsPolicy, the resource policy on the repository is ignored when evaluting permissions.  This ensures that the owner of a repository cannot lock themselves out of the repository, which would prevent them from being  able to update the resource policy.
    @Sendable
    @inlinable
    public func putRepositoryPermissionsPolicy(_ input: PutRepositoryPermissionsPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutRepositoryPermissionsPolicyResult {
        try await self.client.execute(
            operation: "PutRepositoryPermissionsPolicy", 
            path: "/v1/repository/permissions/policy", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Sets the resource policy on a repository that specifies permissions to access it.   When you call PutRepositoryPermissionsPolicy, the resource policy on the repository is ignored when evaluting permissions.  This ensures that the owner of a repository cannot lock themselves out of the repository, which would prevent them from being  able to update the resource policy.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain containing the repository to set the resource policy on.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - policyDocument:  A valid displayable JSON Aspen policy string to be set as the access control resource policy on the provided repository.
    ///   - policyRevision:  Sets the revision of the resource policy that specifies permissions to access the repository.  This revision is used for optimistic locking, which prevents others from overwriting your  changes to the repository's resource policy.
    ///   - repository:  The name of the repository to set the resource policy on.
    ///   - logger: Logger use during operation
    @inlinable
    public func putRepositoryPermissionsPolicy(
        domain: String,
        domainOwner: String? = nil,
        policyDocument: String,
        policyRevision: String? = nil,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutRepositoryPermissionsPolicyResult {
        let input = PutRepositoryPermissionsPolicyRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            policyDocument: policyDocument, 
            policyRevision: policyRevision, 
            repository: repository
        )
        return try await self.putRepositoryPermissionsPolicy(input, logger: logger)
    }

    /// Adds or updates tags for a resource in CodeArtifact.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResult {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/v1/tag", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds or updates tags for a resource in CodeArtifact.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource that you want to add or update tags for.
    ///   - tags: The tags you want to modify or add to the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [Tag],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResult {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes tags from a resource in CodeArtifact.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResult {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/v1/untag", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes tags from a resource in CodeArtifact.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource that you want to remove tags from.
    ///   - tagKeys: The tag key for each tag that you want to remove from the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResult {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates a package group. This API cannot be used to update a package group's origin configuration or pattern. To update a  package group's origin configuration, use UpdatePackageGroupOriginConfiguration.
    @Sendable
    @inlinable
    public func updatePackageGroup(_ input: UpdatePackageGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdatePackageGroupResult {
        try await self.client.execute(
            operation: "UpdatePackageGroup", 
            path: "/v1/package-group", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a package group. This API cannot be used to update a package group's origin configuration or pattern. To update a  package group's origin configuration, use UpdatePackageGroupOriginConfiguration.
    ///
    /// Parameters:
    ///   - contactInfo:  Contact information which you want to update the requested package group with.
    ///   - description:  The description you want to update the requested package group with.
    ///   - domain:  The name of the domain which contains the package group to be updated.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - packageGroup:  The pattern of the package group to be updated.
    ///   - logger: Logger use during operation
    @inlinable
    public func updatePackageGroup(
        contactInfo: String? = nil,
        description: String? = nil,
        domain: String,
        domainOwner: String? = nil,
        packageGroup: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdatePackageGroupResult {
        let input = UpdatePackageGroupRequest(
            contactInfo: contactInfo, 
            description: description, 
            domain: domain, 
            domainOwner: domainOwner, 
            packageGroup: packageGroup
        )
        return try await self.updatePackageGroup(input, logger: logger)
    }

    /// Updates the package origin configuration for a package group. The package origin configuration determines how new versions of a package can be added to a repository. You can allow or block direct  publishing of new package versions, or ingestion and retaining of new package versions from an external connection or upstream source.  For more information about package group origin controls and configuration, see  Package group origin controls  in the CodeArtifact User Guide.
    @Sendable
    @inlinable
    public func updatePackageGroupOriginConfiguration(_ input: UpdatePackageGroupOriginConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdatePackageGroupOriginConfigurationResult {
        try await self.client.execute(
            operation: "UpdatePackageGroupOriginConfiguration", 
            path: "/v1/package-group-origin-configuration", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the package origin configuration for a package group. The package origin configuration determines how new versions of a package can be added to a repository. You can allow or block direct  publishing of new package versions, or ingestion and retaining of new package versions from an external connection or upstream source.  For more information about package group origin controls and configuration, see  Package group origin controls  in the CodeArtifact User Guide.
    ///
    /// Parameters:
    ///   - addAllowedRepositories: The repository name and restrictions to add to the allowed repository list of the specified package group.
    ///   - domain:  The name of the domain which contains the package group for which to update the origin configuration.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - packageGroup:  The pattern of the package group for which to update the origin configuration.
    ///   - removeAllowedRepositories: The repository name and restrictions to remove from the allowed repository list of the specified package group.
    ///   - restrictions:  The origin configuration settings that determine how package versions can enter repositories.
    ///   - logger: Logger use during operation
    @inlinable
    public func updatePackageGroupOriginConfiguration(
        addAllowedRepositories: [PackageGroupAllowedRepository]? = nil,
        domain: String,
        domainOwner: String? = nil,
        packageGroup: String,
        removeAllowedRepositories: [PackageGroupAllowedRepository]? = nil,
        restrictions: [PackageGroupOriginRestrictionType: PackageGroupOriginRestrictionMode]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdatePackageGroupOriginConfigurationResult {
        let input = UpdatePackageGroupOriginConfigurationRequest(
            addAllowedRepositories: addAllowedRepositories, 
            domain: domain, 
            domainOwner: domainOwner, 
            packageGroup: packageGroup, 
            removeAllowedRepositories: removeAllowedRepositories, 
            restrictions: restrictions
        )
        return try await self.updatePackageGroupOriginConfiguration(input, logger: logger)
    }

    ///  Updates the status of one or more versions of a package. Using UpdatePackageVersionsStatus,  you can update the status of package versions to Archived, Published, or Unlisted.  To set the status of a package version to Disposed, use  DisposePackageVersions.
    @Sendable
    @inlinable
    public func updatePackageVersionsStatus(_ input: UpdatePackageVersionsStatusRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdatePackageVersionsStatusResult {
        try await self.client.execute(
            operation: "UpdatePackageVersionsStatus", 
            path: "/v1/package/versions/update_status", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Updates the status of one or more versions of a package. Using UpdatePackageVersionsStatus,  you can update the status of package versions to Archived, Published, or Unlisted.  To set the status of a package version to Disposed, use  DisposePackageVersions.
    ///
    /// Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the package versions with a status to be updated.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - expectedStatus:  The package version’s expected status before it is updated. If expectedStatus is provided, the package version's status is updated only if its status at the time UpdatePackageVersionsStatus is called matches expectedStatus.
    ///   - format:  A format that specifies the type of the package with the statuses to update.
    ///   - namespace: The namespace of the package version to be updated. The package component that specifies its  namespace depends on its type. For example:    The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the package with the version statuses to update.
    ///   - repository:  The repository that contains the package versions with the status you want to update.
    ///   - targetStatus:  The status you want to change the package version status to.
    ///   - versionRevisions:  A map of package versions and package version revisions. The map key is the package version (for example, 3.5.2), and the map value is the package version revision.
    ///   - versions:  An array of strings that specify the versions of the package with the statuses to update.
    ///   - logger: Logger use during operation
    @inlinable
    public func updatePackageVersionsStatus(
        domain: String,
        domainOwner: String? = nil,
        expectedStatus: PackageVersionStatus? = nil,
        format: PackageFormat,
        namespace: String? = nil,
        package: String,
        repository: String,
        targetStatus: PackageVersionStatus,
        versionRevisions: [String: String]? = nil,
        versions: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdatePackageVersionsStatusResult {
        let input = UpdatePackageVersionsStatusRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            expectedStatus: expectedStatus, 
            format: format, 
            namespace: namespace, 
            package: package, 
            repository: repository, 
            targetStatus: targetStatus, 
            versionRevisions: versionRevisions, 
            versions: versions
        )
        return try await self.updatePackageVersionsStatus(input, logger: logger)
    }

    ///  Update the properties of a repository.
    @Sendable
    @inlinable
    public func updateRepository(_ input: UpdateRepositoryRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateRepositoryResult {
        try await self.client.execute(
            operation: "UpdateRepository", 
            path: "/v1/repository", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Update the properties of a repository.
    ///
    /// Parameters:
    ///   - description:  An updated repository description.
    ///   - domain:  The name of the domain associated with the repository to update.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - repository:  The name of the repository to update.
    ///   - upstreams:  A list of upstream repositories to associate with the repository. The order of the upstream repositories  in the list determines their priority order when CodeArtifact looks for a requested package version. For more  information, see Working with upstream repositories.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateRepository(
        description: String? = nil,
        domain: String,
        domainOwner: String? = nil,
        repository: String,
        upstreams: [UpstreamRepository]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateRepositoryResult {
        let input = UpdateRepositoryRequest(
            description: description, 
            domain: domain, 
            domainOwner: domainOwner, 
            repository: repository, 
            upstreams: upstreams
        )
        return try await self.updateRepository(input, logger: logger)
    }
}

extension CodeArtifact {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: CodeArtifact, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension CodeArtifact {
    /// Return PaginatorSequence for operation ``listAllowedRepositoriesForGroup(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAllowedRepositoriesForGroupPaginator(
        _ input: ListAllowedRepositoriesForGroupRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAllowedRepositoriesForGroupRequest, ListAllowedRepositoriesForGroupResult> {
        return .init(
            input: input,
            command: self.listAllowedRepositoriesForGroup,
            inputKey: \ListAllowedRepositoriesForGroupRequest.nextToken,
            outputKey: \ListAllowedRepositoriesForGroupResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAllowedRepositoriesForGroup(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain:  The name of the domain that contains the package group from which to list allowed repositories.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - originRestrictionType: The origin configuration restriction type of which to list allowed repositories.
    ///   - packageGroup: The pattern of the package group from which to list allowed repositories.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAllowedRepositoriesForGroupPaginator(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        originRestrictionType: PackageGroupOriginRestrictionType,
        packageGroup: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAllowedRepositoriesForGroupRequest, ListAllowedRepositoriesForGroupResult> {
        let input = ListAllowedRepositoriesForGroupRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            originRestrictionType: originRestrictionType, 
            packageGroup: packageGroup
        )
        return self.listAllowedRepositoriesForGroupPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listAssociatedPackages(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAssociatedPackagesPaginator(
        _ input: ListAssociatedPackagesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAssociatedPackagesRequest, ListAssociatedPackagesResult> {
        return .init(
            input: input,
            command: self.listAssociatedPackages,
            inputKey: \ListAssociatedPackagesRequest.nextToken,
            outputKey: \ListAssociatedPackagesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAssociatedPackages(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain:  The name of the domain that contains the package group from which to list associated packages.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - packageGroup:  The pattern of the package group from which to list associated packages.
    ///   - preview:  When this flag is included, ListAssociatedPackages will return a list of packages that would be associated with a package  group, even if it does not exist.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAssociatedPackagesPaginator(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        packageGroup: String,
        preview: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAssociatedPackagesRequest, ListAssociatedPackagesResult> {
        let input = ListAssociatedPackagesRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            packageGroup: packageGroup, 
            preview: preview
        )
        return self.listAssociatedPackagesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listDomains(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listDomainsPaginator(
        _ input: ListDomainsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListDomainsRequest, ListDomainsResult> {
        return .init(
            input: input,
            command: self.listDomains,
            inputKey: \ListDomainsRequest.nextToken,
            outputKey: \ListDomainsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listDomains(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - logger: Logger used for logging
    @inlinable
    public func listDomainsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListDomainsRequest, ListDomainsResult> {
        let input = ListDomainsRequest(
            maxResults: maxResults
        )
        return self.listDomainsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPackageGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackageGroupsPaginator(
        _ input: ListPackageGroupsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPackageGroupsRequest, ListPackageGroupsResult> {
        return .init(
            input: input,
            command: self.listPackageGroups,
            inputKey: \ListPackageGroupsRequest.nextToken,
            outputKey: \ListPackageGroupsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPackageGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain:  The domain for which you want to list package groups.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - prefix:  A prefix for which to search package groups. When included, ListPackageGroups will return only package groups with patterns that match the prefix.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackageGroupsPaginator(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        prefix: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPackageGroupsRequest, ListPackageGroupsResult> {
        let input = ListPackageGroupsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            prefix: prefix
        )
        return self.listPackageGroupsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPackageVersionAssets(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackageVersionAssetsPaginator(
        _ input: ListPackageVersionAssetsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPackageVersionAssetsRequest, ListPackageVersionAssetsResult> {
        return .init(
            input: input,
            command: self.listPackageVersionAssets,
            inputKey: \ListPackageVersionAssetsRequest.nextToken,
            outputKey: \ListPackageVersionAssetsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPackageVersionAssets(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain:  The name of the domain that contains the repository associated with the package version assets.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  The format of the package that contains the requested package version assets.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - namespace: The namespace of the package version that contains the requested package version assets. The package component that specifies its  namespace depends on its type. For example:  The namespace is required requesting assets from package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - package:  The name of the package that contains the requested package version assets.
    ///   - packageVersion:  A string that contains the package version (for example, 3.5.2).
    ///   - repository:  The name of the repository that contains the package that contains the requested package version assets.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackageVersionAssetsPaginator(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        maxResults: Int? = nil,
        namespace: String? = nil,
        package: String,
        packageVersion: String,
        repository: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPackageVersionAssetsRequest, ListPackageVersionAssetsResult> {
        let input = ListPackageVersionAssetsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            maxResults: maxResults, 
            namespace: namespace, 
            package: package, 
            packageVersion: packageVersion, 
            repository: repository
        )
        return self.listPackageVersionAssetsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPackageVersions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackageVersionsPaginator(
        _ input: ListPackageVersionsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPackageVersionsRequest, ListPackageVersionsResult> {
        return .init(
            input: input,
            command: self.listPackageVersions,
            inputKey: \ListPackageVersionsRequest.nextToken,
            outputKey: \ListPackageVersionsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPackageVersions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the requested package versions.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format:  The format of the package versions you want to list.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - namespace: The namespace of the package that contains the requested package versions. The package component that specifies its  namespace depends on its type. For example:  The namespace is required when deleting package versions of the following formats:   Maven   Swift   generic       The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - originType: The originType used to filter package versions.  Only package versions with the provided originType will be returned.
    ///   - package:  The name of the package for which you want to request package versions.
    ///   - repository:  The name of the repository that contains the requested package versions.
    ///   - sortBy:  How to sort the requested list of package versions.
    ///   - status:  A string that filters the requested package versions by status.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackageVersionsPaginator(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat,
        maxResults: Int? = nil,
        namespace: String? = nil,
        originType: PackageVersionOriginType? = nil,
        package: String,
        repository: String,
        sortBy: PackageVersionSortType? = nil,
        status: PackageVersionStatus? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPackageVersionsRequest, ListPackageVersionsResult> {
        let input = ListPackageVersionsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            maxResults: maxResults, 
            namespace: namespace, 
            originType: originType, 
            package: package, 
            repository: repository, 
            sortBy: sortBy, 
            status: status
        )
        return self.listPackageVersionsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPackages(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackagesPaginator(
        _ input: ListPackagesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPackagesRequest, ListPackagesResult> {
        return .init(
            input: input,
            command: self.listPackages,
            inputKey: \ListPackagesRequest.nextToken,
            outputKey: \ListPackagesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPackages(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain:  The name of the domain that contains the repository that contains the requested packages.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - format: The format used to filter requested packages. Only packages from the provided format will be returned.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - namespace: The namespace prefix used to filter requested packages.  Only packages with a namespace that starts with the provided string value are returned.  Note that although this option is called --namespace and not --namespace-prefix, it has prefix-matching behavior. Each package format uses namespace as follows:    The namespace of a Maven package version is its groupId.     The namespace of an npm or Swift package version is its scope.    The namespace of a generic package is its namespace.    Python, NuGet, Ruby, and Cargo package versions do not contain a corresponding component, package versions  of those formats do not have a namespace.
    ///   - packagePrefix:  A prefix used to filter requested packages. Only packages with names that start with  packagePrefix are returned.
    ///   - publish: The value of the Publish package origin control restriction used to filter requested packages.  Only packages with the provided restriction are returned.  For more information, see PackageOriginRestrictions.
    ///   - repository:  The name of the repository that contains the requested packages.
    ///   - upstream: The value of the Upstream package origin control restriction used to filter requested packages.  Only packages with the provided restriction are returned. For more information, see PackageOriginRestrictions.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackagesPaginator(
        domain: String,
        domainOwner: String? = nil,
        format: PackageFormat? = nil,
        maxResults: Int? = nil,
        namespace: String? = nil,
        packagePrefix: String? = nil,
        publish: AllowPublish? = nil,
        repository: String,
        upstream: AllowUpstream? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPackagesRequest, ListPackagesResult> {
        let input = ListPackagesRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            format: format, 
            maxResults: maxResults, 
            namespace: namespace, 
            packagePrefix: packagePrefix, 
            publish: publish, 
            repository: repository, 
            upstream: upstream
        )
        return self.listPackagesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listRepositories(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listRepositoriesPaginator(
        _ input: ListRepositoriesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListRepositoriesRequest, ListRepositoriesResult> {
        return .init(
            input: input,
            command: self.listRepositories,
            inputKey: \ListRepositoriesRequest.nextToken,
            outputKey: \ListRepositoriesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listRepositories(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - repositoryPrefix:  A prefix used to filter returned repositories. Only repositories with names that start with repositoryPrefix are returned.
    ///   - logger: Logger used for logging
    @inlinable
    public func listRepositoriesPaginator(
        maxResults: Int? = nil,
        repositoryPrefix: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListRepositoriesRequest, ListRepositoriesResult> {
        let input = ListRepositoriesRequest(
            maxResults: maxResults, 
            repositoryPrefix: repositoryPrefix
        )
        return self.listRepositoriesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listRepositoriesInDomain(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listRepositoriesInDomainPaginator(
        _ input: ListRepositoriesInDomainRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListRepositoriesInDomainRequest, ListRepositoriesInDomainResult> {
        return .init(
            input: input,
            command: self.listRepositoriesInDomain,
            inputKey: \ListRepositoriesInDomainRequest.nextToken,
            outputKey: \ListRepositoriesInDomainResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listRepositoriesInDomain(_:logger:)``.
    ///
    /// - Parameters:
    ///   - administratorAccount:  Filter the list of repositories to only include those that are managed by the Amazon Web Services account ID.
    ///   - domain:  The name of the domain that contains the returned list of repositories.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - repositoryPrefix:  A prefix used to filter returned repositories. Only repositories with names that start with  repositoryPrefix are returned.
    ///   - logger: Logger used for logging
    @inlinable
    public func listRepositoriesInDomainPaginator(
        administratorAccount: String? = nil,
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        repositoryPrefix: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListRepositoriesInDomainRequest, ListRepositoriesInDomainResult> {
        let input = ListRepositoriesInDomainRequest(
            administratorAccount: administratorAccount, 
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            repositoryPrefix: repositoryPrefix
        )
        return self.listRepositoriesInDomainPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listSubPackageGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listSubPackageGroupsPaginator(
        _ input: ListSubPackageGroupsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListSubPackageGroupsRequest, ListSubPackageGroupsResult> {
        return .init(
            input: input,
            command: self.listSubPackageGroups,
            inputKey: \ListSubPackageGroupsRequest.nextToken,
            outputKey: \ListSubPackageGroupsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listSubPackageGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain:  The name of the domain which contains the package group from which to list sub package groups.
    ///   - domainOwner:  The 12-digit account number of the Amazon Web Services account that owns the domain. It does not include  dashes or spaces.
    ///   - maxResults:  The maximum number of results to return per page.
    ///   - packageGroup:  The pattern of the package group from which to list sub package groups.
    ///   - logger: Logger used for logging
    @inlinable
    public func listSubPackageGroupsPaginator(
        domain: String,
        domainOwner: String? = nil,
        maxResults: Int? = nil,
        packageGroup: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListSubPackageGroupsRequest, ListSubPackageGroupsResult> {
        let input = ListSubPackageGroupsRequest(
            domain: domain, 
            domainOwner: domainOwner, 
            maxResults: maxResults, 
            packageGroup: packageGroup
        )
        return self.listSubPackageGroupsPaginator(input, logger: logger)
    }
}

extension CodeArtifact.ListAllowedRepositoriesForGroupRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListAllowedRepositoriesForGroupRequest {
        return .init(
            domain: self.domain,
            domainOwner: self.domainOwner,
            maxResults: self.maxResults,
            nextToken: token,
            originRestrictionType: self.originRestrictionType,
            packageGroup: self.packageGroup
        )
    }
}

extension CodeArtifact.ListAssociatedPackagesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListAssociatedPackagesRequest {
        return .init(
            domain: self.domain,
            domainOwner: self.domainOwner,
            maxResults: self.maxResults,
            nextToken: token,
            packageGroup: self.packageGroup,
            preview: self.preview
        )
    }
}

extension CodeArtifact.ListDomainsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListDomainsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension CodeArtifact.ListPackageGroupsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListPackageGroupsRequest {
        return .init(
            domain: self.domain,
            domainOwner: self.domainOwner,
            maxResults: self.maxResults,
            nextToken: token,
            prefix: self.prefix
        )
    }
}

extension CodeArtifact.ListPackageVersionAssetsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListPackageVersionAssetsRequest {
        return .init(
            domain: self.domain,
            domainOwner: self.domainOwner,
            format: self.format,
            maxResults: self.maxResults,
            namespace: self.namespace,
            nextToken: token,
            package: self.package,
            packageVersion: self.packageVersion,
            repository: self.repository
        )
    }
}

extension CodeArtifact.ListPackageVersionsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListPackageVersionsRequest {
        return .init(
            domain: self.domain,
            domainOwner: self.domainOwner,
            format: self.format,
            maxResults: self.maxResults,
            namespace: self.namespace,
            nextToken: token,
            originType: self.originType,
            package: self.package,
            repository: self.repository,
            sortBy: self.sortBy,
            status: self.status
        )
    }
}

extension CodeArtifact.ListPackagesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListPackagesRequest {
        return .init(
            domain: self.domain,
            domainOwner: self.domainOwner,
            format: self.format,
            maxResults: self.maxResults,
            namespace: self.namespace,
            nextToken: token,
            packagePrefix: self.packagePrefix,
            publish: self.publish,
            repository: self.repository,
            upstream: self.upstream
        )
    }
}

extension CodeArtifact.ListRepositoriesInDomainRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListRepositoriesInDomainRequest {
        return .init(
            administratorAccount: self.administratorAccount,
            domain: self.domain,
            domainOwner: self.domainOwner,
            maxResults: self.maxResults,
            nextToken: token,
            repositoryPrefix: self.repositoryPrefix
        )
    }
}

extension CodeArtifact.ListRepositoriesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListRepositoriesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            repositoryPrefix: self.repositoryPrefix
        )
    }
}

extension CodeArtifact.ListSubPackageGroupsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> CodeArtifact.ListSubPackageGroupsRequest {
        return .init(
            domain: self.domain,
            domainOwner: self.domainOwner,
            maxResults: self.maxResults,
            nextToken: token,
            packageGroup: self.packageGroup
        )
    }
}
